package ma.ensao.egicom.bank.services.dao.interfaces;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.scub.foundation.framework.core.dao.implementations.HibernateDaoBaseImplementation;
import org.scub.foundation.framework.core.model.BaseModel;

/**
 * Class patché d'.<code>HibernateDaoBaseImplementation</code> ajoutant des fonctionnalités de récupurations des données 
 * @author MILHI Yassine (milhi.yassinee@gmail.com)
 */
public class HibernateDaoBaseImplementationPatch extends HibernateDaoBaseImplementation {

    /**
     * Retourne une liste d'op&eacute;rations respectant un filtre.
     * @param propertyName le nom de la proprit&eacute; dans la table
     * @param value la valeur &agrave; filter avec
     * @param clazz la classe template
     * @param tableName le nom de la table dans la base de données
     * @return une liste des compte qui respectent les filtres
     */
    @SuppressWarnings("unchecked")
    public List<? extends BaseModel> getOperationByProperty(String propertyName, Object value, Class<? extends BaseModel> clazz, String tableName) {
        try {
            String queryString = "from " + tableName + " as model where model." + propertyName + "= ?";
            Query queryObject = createQuery(queryString);
            queryObject.setParameter(0, value);
            return Collections.checkedList(queryObject.list(), clazz);
        } catch (RuntimeException re) {
            throw re;
        }
    }

    /**
     * Retourne une liste d'op&eacute;rations respectant les filtres.
     * @param properties une map des propri&eacute;tes cl&eacute;(le nom de la propri&eacute;t&eacute;) / valeur (La valeur de la propri&eacute;t&eacute;).
     * @param clazz la classe template
     * @param tableName le nom de la table dans la base de données
     * @return une liste des compte qui respectent les filtres
     */
    @SuppressWarnings("unchecked")
    public List<? extends BaseModel> getOperationByProperties(Map<String, Object> properties, Class<? extends BaseModel> clazz, String tableName) {
        try {
            String queryString = "from " + tableName + " as model where ";
            int i = 1;
            for (String key : properties.keySet()) {
                queryString += "model." + key + "= ? ";
                i++;
                if (i != properties.size()) {
                    queryString += "and ";
                }
            }
            Query queryObject = createQuery(queryString);
            i = 0;
            for (Object value : properties.values()) {
                queryObject.setParameter(i++, value);
            }
            return Collections.checkedList(queryObject.list(), clazz);
        } catch (RuntimeException re) {
            throw re;
        }
    }
}
